perm filename BORDER.SAI[PIC,HE] blob
sn#430354 filedate 1979-04-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY ICASEV,JCASEV,BDRPRE,BDRPOST,BORDER
C00007 ENDMK
C⊗;
ENTRY ICASEV,JCASEV,BDRPRE,BDRPOST,BORDER;
BEGIN "BORDER"
REQUIRE "BUFDEC" SOURCE!FILE;
SIMPLE INTERNAL INTEGER PROCEDURE ICASEV(INTEGER INX);
RETURN(CASE INX OF (0,-1,-1,-1,0,1,1,1));
SIMPLE INTERNAL INTEGER PROCEDURE JCASEV(INTEGER INX);
RETURN(CASE INX OF (1,1,0,-1,-1,-1,0,1));
SIMPLE INTERNAL INTEGER PROCEDURE BDRPRE(REFERENCE INTEGER N; INTEGER I,J,ibuf,RWS,COLS; SAFE INTEGER ARRAY NEIGHBORS);
BEGIN "BDRPRE"
INTEGER IIND,JIND,M;
FOR M←0 THRU 7 DO
BEGIN "LOAD1"
IIND←I+ICASEV(M);
JIND←J+JCASEV(M);
IF 1≤IIND≤RWS AND 1≤JIND≤COLS
THEN NEIGHBORS[M]←GETPNT(IIND,JIND,IBUF)
ELSE NEIGHBORS[M]←0;
END "LOAD1";
FOR N←0 STEP 1 WHILE N<8 AND NEIGHBORS[N] DO;
IF N>7
THEN BEGIN
PRINT("BAD STARTING POINT",CRLF);
RETURN(0);
END;
FOR N←N+1 THRU 7 DO
IF NEIGHBORS[N] THEN DONE;
IF N=8 AND NOT NEIGHBORS[N←0] THEN RETURN(-1); ! A SINGLE POINT;
RETURN(1);
END "BDRPRE";
SIMPLE INTERNAL PROCEDURE BDRPOST(REFERENCE INTEGER N,ST,TEMP;
INTEGER I,J,IBUF,RWS,COLS; SAFE INTEGER ARRAY NEIGHBORS);
BEGIN "BDRPOST"
INTEGER IIND,JIND,M;
ST←IF (TEMP LAND 1)
THEN IF (TEMP←TEMP-3)<0 THEN 8+TEMP
ELSE TEMP
ELSE IF (TEMP←TEMP-2)<0 THEN 8+TEMP
ELSE TEMP;
N←0;
FOR M←0 THRU 7 DO
BEGIN
TEMP←(M+ST) MOD 8;
IIND←I+ICASEV(TEMP);
JIND←J+JCASEV(TEMP);
IF 1≤IIND≤RWS AND 1≤JIND≤COLS
THEN BEGIN
IF (NEIGHBORS[M]←GETPNT(IIND,JIND,IBUF)) AND NOT N THEN N←M;
END
ELSE NEIGHBORS[M]←0;
END;
END "BDRPOST";
INTERNAL integer PROCEDURE BORDER(INTEGER II,JJ,IBUF,OBUF; REFERENCE INTEGER IMIN,IMAX,JMIN,JMAX; integer value);
BEGIN "BORDERFOLLOW"
SAFE INTEGER ARRAY NEIGHBORS[0:7];
INTEGER REGNUM,K,L,M,N,INITI,INITJ,P,OLDVAL,RWS,COLS,I,J,ST,TEMP,IIND,JIND,numpt,val,offi,offj,noput,ckout;
ckout←0;
RWS←ROWS(IBUF); COLS←COLMS(IBUF);
I←INITI←II; J←INITJ←JJ;
ST←0;
offi←isubst(ibuf)-isubst(obuf);
offj←jsubst(ibuf)-jsubst(obuf);
val←if value<-1 then -value else value;
noput←if ibuf=obuf ∧ bytsz(ibuf)=1 then -1 else 0;
numpt←0;
IF (DUM←BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS))≤0 THEN RETURN(DUM);
WHILE TRUE DO
BEGIN "LOOP"
TEMP←(N+ST) MOD 8;
I←I+ICASEV(TEMP);
J←J+JCASEV(TEMP);
if ckout then if ((val=0) or getpnt(i+offi,j+offj,obuf)) then return(numpt) else ckout←0;
if value>0 ∧ (dum←getpnt(i+offi,j+offj,obuf)) then if dum≠value then return(0);
if ¬noput then PUTPNT(I+offi,J+offj,val,OBUF);
numpt←numpt+1;
IF I<IMIN THEN IMIN←I
ELSE IF I>IMAX THEN IMAX←I;
IF J<JMIN THEN JMIN←J
ELSE IF J>JMAX THEN JMAX←J;
IF I=INITI AND J=INITJ THEN ckout←-1;
BDRPOST(N,ST,TEMP,I,J,IBUF,RWS,COLS,NEIGHBORS);
END "LOOP";
END "BORDERFOLLOW";
END "BORDER"